home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / filesyst / dosfs / dosfsck_.z / dosfsck_ / dosfsck / boot.c next >
C/C++ Source or Header  |  1993-05-07  |  3KB  |  76 lines

  1. /* boot.c  -  Read and analyze ia PC/MS-DOS boot sector */
  2.  
  3. /* Written 1993 by Werner Almesberger */
  4.  
  5.  
  6. #include <stdio.h>
  7. #include <linux/msdos_fs.h>
  8.  
  9. #include "common.h"
  10. #include "dosfsck.h"
  11. #include "io.h"
  12. #include "boot.h"
  13.  
  14.  
  15. #define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0)
  16.     /* don't divide by zero */
  17.  
  18.  
  19. static void dump_boot(DOS_FS *fs,struct msdos_boot_sector *b)
  20. {
  21.     printf("Boot sector contents:\n");
  22.     printf("%10d bytes per logical sector\n",CF_LE_W(*(unsigned short *)
  23.       &b->sector_size));
  24.     printf("%10d bytes per cluster\n",fs->cluster_size);
  25.     printf("%10d reserved sectors\n",CF_LE_W(b->reserved));
  26.     printf("First FAT starts at byte %u\n",fs->fat_start);
  27.     printf("%10d FATs\n",b->fats);
  28.     printf("%10d bytes per FAT\n",fs->fat_size);
  29.     printf("Root directory starts at byte %u\n",fs->root_start);
  30.     printf("%10d root directory entries\n",fs->root_entries);
  31.     printf("Data area starts at byte %u\n",fs->data_start);
  32.     printf("%10u data clusters (%u bytes)\n",fs->clusters,fs->clusters*
  33.       fs->cluster_size);
  34. }
  35.  
  36.  
  37. void read_boot(DOS_FS *fs)
  38. {
  39.     struct msdos_boot_sector b;
  40.     int logical_sector_size,fat_entries,data_size;
  41.  
  42.     fs_read(0,sizeof(b),&b);
  43.     logical_sector_size = CF_LE_W(*(unsigned short *) &b.sector_size);
  44.     fs->cluster_size = b.cluster_size*logical_sector_size;
  45.     if (b.fats != 2)
  46.     die("Currently, only 2 FATs are supported, not %d.\n",b.fats);
  47.     fs->fat_start = CF_LE_W(b.reserved)*logical_sector_size;
  48.     fs->fat_size = CF_LE_W(b.fat_length)*logical_sector_size;
  49.     fs->root_start = (CF_LE_W(b.reserved)+b.fats*CF_LE_W(b.fat_length))*
  50.       logical_sector_size;
  51.     fs->root_entries = CF_LE_W(*((unsigned short *) &b.dir_entries));
  52.     fs->data_start = fs->root_start+ROUND_TO_MULTIPLE(fs->root_entries <<
  53.       MSDOS_DIR_BITS,logical_sector_size);
  54.     data_size = (CF_LE_W(*((unsigned short *) &b.sectors)) ? CF_LE_W(
  55.       *((unsigned short *) &b.sectors)) : CF_LE_L(b.total_sect))*
  56.       logical_sector_size-fs->data_start;
  57.     if (!fs->cluster_size) die("Cluster size is zero.");
  58.     if (!logical_sector_size) die("Logical sector size is zero.");
  59.     fs->clusters = data_size/fs->cluster_size;
  60.     fat_entries = (fs->clusters > MSDOS_FAT12 ? fs->fat_size/2 :
  61.       fs->fat_size*2/3)-2;
  62.     if (fs->clusters > fat_entries)
  63.     die("File system has %d clusters but only space for %d FAT entries.",
  64.       fs->clusters,fat_entries);
  65.     if (!fs->root_entries) die("Root directory has zero size.");
  66.     if (fs->root_entries & (MSDOS_DPS-1))
  67.     die("Root directory (%d entries) doesn't span an integral number of "
  68.       "sectors.",fs->root_entries);
  69.     if (logical_sector_size & (SECTOR_SIZE-1))
  70.     die("Logical sector size (%d bytes) is not a multiple of the physical "
  71.       "sector size.",logical_sector_size);
  72.     if (!b.secs_track || !b.heads)
  73.     die("Invalid disk format in boot sector.");
  74.     if (verbose) dump_boot(fs,&b);
  75. }
  76.